home *** CD-ROM | disk | FTP | other *** search
/ Programming Sound Cards / Programming Sound Cards.iso / sound_31 / gusmod.asm < prev    next >
Assembly Source File  |  1995-01-01  |  42KB  |  1,663 lines

  1. ;                  Gusmod v2.11
  2. ;         By Joshua C. Jensen (CyberStrike of Renaissance)
  3. ;             Copyright (C) 1992,1993
  4. ;═══════════════════════════════════════════════════════════════════════════════
  5.  
  6. ideal
  7. P286
  8. model    Huge
  9. jumps
  10.  
  11. stack    1024
  12.  
  13. include "gusmod.inc"
  14.  
  15. Ins_Line    = 20
  16. Vol_Column    = 24
  17. Per_Column    = 74
  18. Pan_Column    = 57
  19. Name_Col    = 1
  20. freek_Line      = 24
  21. freek_Col    = 69
  22. maxk_Line       = 24
  23. maxk_Col        = 75
  24. Seq_Row     = 19
  25.  
  26. segment MyCode
  27.  
  28.         assume    cs:MyCode,ds:MyData
  29.  
  30. MMus            SMus    <>
  31. P        PM    <>
  32. MusBuf        dw    0
  33. Chan            db      0
  34. Music        dw    0,BlankMusicSeg
  35. Mode        db    0        ; 0 - Text
  36.                     ; 1 - Graphics
  37. PanPos        db    3,12,12,3
  38. MaxVol        db    100
  39. ChanVol     db    100,100,100,100
  40. PlayStat    db    0
  41.  
  42. GraphFile       db      'SCOPES.INF',0
  43. ConfigFile    db    'GUSMOD.INF',0
  44. GTSRConfigFile  db      'GTSR.INF',0
  45. ScreenFile    db    'SCREEN.INF',0
  46. GConfigFile    db    'GSETUP.CFG',0
  47. TopOfMusic    dw    0
  48.  
  49. include     "gmoddisp.asm"
  50. include     "modload.asm"
  51.  
  52. proc            WriteAltScrn1 near
  53.         mov    ax,MyData
  54.         mov    ds,ax
  55.         call    WriteMemLeft
  56.  
  57.         call    GetInfo
  58.         call    Ed_Sequence
  59.                 call    Ed_Percent
  60.         call    Ed_Pan
  61.         call    Ed_PlayStatus
  62.  
  63.         mov    [Word OldPos],0FFFFh
  64.         ret
  65. endp        WriteAltScrn1
  66.  
  67. proc            Ed_DoPat near
  68.                 push    si di cx
  69.         push    cx
  70.         cmp    [Byte Ed_DontDoPattern],0
  71.         je    @@DrawNumbers
  72.         mov    si,offset Ed_DashStr
  73.         jmp    @@0A
  74. @@DrawNumbers:    xchg    al,ah
  75.         add    di,ax
  76.         mov    al,[es:di]        ; Sequence Channel number in AL
  77.         push    es
  78.         push    ds
  79.         pop    es
  80.         xor    ah,ah
  81.         mov    di,offset Ed_Zeroes
  82.         mov    cx,3
  83.         call    MakeDec
  84.         pop    es
  85.         mov    si,offset Ed_Zeroes
  86. @@0A:        pop    cx
  87.         mov    ax,4
  88.         mul    cx
  89.         xor    dx,dx
  90.         mov    di,(Seq_Row*80+18)*2-1
  91.         add    di,ax
  92.         add    di,ax
  93.         mov    cx,3
  94.         call    DirectWrite1
  95.                 pop     cx di si
  96.                 ret
  97. endp        Ed_DoPat
  98.  
  99. proc            Ed_Sequence near
  100.         push    ds
  101.         mov    ax,MyData
  102.         mov    ds,ax
  103.         mov    es,ax
  104.         mov    di,offset Ed_PatternStr+4
  105.         mov    al,[cs:numpatterns]
  106.                 mov     cx,3
  107.         call    MakeDec
  108.         mov    di,offset Ed_PatternStr
  109.         xor    ah,ah
  110.         mov    al,[CurBlock]
  111.         mov    cx,3
  112.         call    MakeDec
  113.         mov    di,(Seq_Row*80+1)*2-1
  114.         mov    si,offset Ed_PatternStr
  115.         mov    cx,7
  116.         call    DirectWrite1
  117.  
  118.         mov    di,offset Ed_PatternStr
  119.         xor    ah,ah
  120.         mov    al,[cs:offset MMus+(offset (SMus).mt_SongPos)]
  121.         mov    cx,3
  122.         call    MakeDec
  123.         mov    al,[cs:offset MMus+(offset (SMus).songlen)]
  124.         dec    al
  125.         mov    di,offset Ed_PatternStr+4
  126.         xor    ah,ah
  127.         mov    cx,3
  128.         call    MakeDec
  129.         mov    di,(Seq_Row*80+9)*2-1
  130.         mov    si,offset Ed_PatternStr
  131.         mov    cx,7
  132.         call    DirectWrite1
  133.         les    bx,[cs:offset MMus+(offset (SMus).HeaderLoc)]
  134.         add    bx,(offset (HS).Sequences)
  135.         mov    si,bx
  136.         mov    di,bx
  137.         sub    di,3
  138.         mov    cx,0
  139. @@2:        xor    ax,ax
  140.         mov    ah,[cs:offset MMus+(offset (SMus).mt_SongPos)]
  141. @@1:        add    ah,cl
  142.         cmp    ah,3
  143.         jge    @@2_1
  144. @@2_0:        mov    [Byte Ed_DontDoPattern],01h
  145.         jmp    @@3
  146. @@2_1:        mov    bl,[cs:offset MMus+(offset (SMus).songlen)]
  147.         add    bl,3
  148.         cmp    ah,bl
  149.         jge    @@2_0
  150. @@3:        push    si
  151.         call    Ed_DoPat
  152.         pop    si
  153.         mov    [Byte Ed_DontDoPattern],00h
  154.         inc    cx
  155.         cmp    cx,7
  156.         jne    @@2
  157.         pop    ds
  158.                 ret
  159. endp        Ed_Sequence
  160.  
  161. TempStore    dw    0
  162. Percent     db    0
  163. proc            Ed_Percent near
  164.         push    ds es
  165.         mov    ax,MyData
  166.         mov    ds,ax
  167.         mov    es,ax
  168.  
  169.         mov    di,offset Ed_Zeroes
  170.                 xor     ah,ah
  171.                 mov     al,[cs:offset MMus+(offset (SMus).MaxVolume)]
  172.                 mov     cl,101
  173.                 mul     cl
  174.                 mov     al,ah
  175.         mov    [cs:Percent],al
  176.         mov    cx,3
  177.                 call    MakeDec
  178.         mov    di,(Seq_Row*80+63)*2-1
  179.                 mov     si,offset Ed_Zeroes
  180.                 mov     cx,3
  181.                 call    DirectWrite1
  182.  
  183.         mov    cx,0
  184.         les    bx,[cs:offset MMus+(offset (SMus).ChannelLoc)]
  185.         mov    [Word cs:TempStore],(Ins_Line*80+Per_Column)*2-1
  186. @@ChannelLoop:    push    cx
  187.         mov    di,offset Ed_Zeroes
  188.         mov    al,[Byte cs:offset MMus+(offset (SMus).MaxVolume)]
  189.         or    al,al
  190.         je    @@SkipDiv
  191.         xor    ah,ah
  192.         mov    al,[es:bx+MS.MasterVolume]
  193.         mov    cx,100
  194.         mul    cx
  195.         xor    dx,dx
  196.         xor    ch,ch
  197.         mov    cl,[cs:offset MMus+(offset (SMus).MaxVolume)]
  198.         div    cx
  199. @@SkipDiv:    push    es bx
  200.         mov    cx,MyData
  201.         mov    es,cx
  202.         mov    cx,3
  203.                 call    MakeDec
  204.         pop    bx es
  205.         mov    di,[cs:TempStore]
  206.         mov    si,offset Ed_Zeroes
  207.         mov    cx,3
  208.                 call    DirectWrite1
  209.         add    [Word cs:TempStore],160
  210.         pop    cx
  211.         add    bx,size MS
  212.         inc    cx
  213.         cmp    cx,4
  214.         jne    @@ChannelLoop
  215.         pop    es ds
  216.         ret
  217. endp            Ed_Percent
  218.  
  219. proc            Ed_Pan near
  220.         push    ds es
  221.         mov    ax,MyData
  222.         mov    ds,ax
  223.         mov    es,ax
  224.  
  225.         mov    cx,0
  226.         les    bx,[cs:offset MMus+(offset (SMus).ChannelLoc)]
  227.         mov    [Word cs:TempStore],(Ins_Line*80+Pan_Column)*2
  228. @@ChannelLoop:    push    cx
  229.         xor    dh,dh
  230.         mov    dl,[es:bx+MS.sc_PanPosition]
  231.         mov    di,[cs:TempStore]
  232.         push    es
  233.         mov    es,[cs:Screen]
  234.         mov    cx,16
  235.         mov    ax,0
  236.         rep    stosw
  237.         mov    di,[cs:TempStore]
  238.         add    di,dx
  239.         add    di,dx
  240.                 mov     ax,0FFEh
  241.                 stosw
  242.         pop    es
  243.         add    [Word cs:TempStore],160
  244.         pop    cx
  245.         add    bx,size MS
  246.         inc    cx
  247.         cmp    cx,4
  248.         jne    @@ChannelLoop
  249.         pop    es ds
  250.         ret
  251. endp        Ed_Pan
  252.  
  253. proc            FindNote near
  254.                 push    bx
  255.  
  256.         mov    al,[es:si]
  257.         and    ax,00111111b
  258.         mov    bx,ax
  259.         shl    ax,1
  260.         add    bx,ax
  261.         add    bx,offset Notes
  262.                 mov     ax,[bx]                 ; Copy note string
  263.                 mov     [di],ax
  264.                 mov     al,[bx+02h]
  265.                 mov     [di+02h],al
  266.  
  267.         mov    al,[es:si+1]        ; Get lo instrument number
  268.                 and     al,0f0h
  269.                 shr     al,4
  270.                 mov     ah,[es:si]              ; Get hi instrument number
  271.         and    ah,11000000b
  272.         shr    ah,2
  273.                 or      al,ah
  274.                 add     di,4
  275.  
  276.                 push    es
  277.                 push    ds
  278.                 pop     es
  279.                 mov     cx,2
  280.                 call    MakeHex
  281.                 pop     es
  282.                 add     di,3
  283.  
  284.         mov    ax,[es:si+1]
  285.                 xchg    ah,al
  286.                 and     ax,0fffh
  287.                 push    ax
  288.                 mov     bx,ax
  289.                 cmp     bh,0
  290.                 jne     @@2_1
  291.                 cmp     al,0
  292.                 jne     @@2_1
  293.                 mov     ax,0
  294.                 jmp     @@2_2
  295. @@2_1:          mov     ax,3
  296.                 inc     bh
  297.                 mul     bh
  298. @@2_2:          add     ax,offset ARP
  299.                 mov     bx,ax
  300.                 mov     cx,3
  301. @@3:            mov     ax,[bx]
  302.                 mov     [di],ax
  303.                 inc     bx
  304.                 inc     di
  305.                 loop    @@3
  306.                 pop     ax
  307.                 push    es
  308.                 push    ds
  309.                 pop     es
  310.                 mov     cx,2
  311.                 call    MakeHex
  312.                 pop     es
  313.                 add     di,2
  314.         add    si,3
  315.                 pop     bx
  316.                 ret
  317. endp            FindNote
  318.  
  319. proc            MakeOne near
  320.                 push    ds
  321.                 pop     es
  322.         mov    di,offset PatternLine+1
  323.         xor    dx,dx
  324.         mov    ax,[TempPos]
  325.         mov    bx,48
  326.         div    bx
  327.                 mov     cx,3
  328.                 call    MakeDec
  329.  
  330.                 mov     es,[CurLineSeg]
  331.                 mov     si,[TempPos]
  332.         mov    di,offset PatternLine+5
  333.                 call    FindNote
  334.         mov    di,offset PatternLine+19
  335.                 call    FindNote
  336.         mov    di,offset PatternLine+33
  337.                 call    FindNote
  338.         mov    di,offset PatternLine+47
  339.                 call    FindNote
  340.  
  341.                 ret
  342. endp            MakeOne
  343.  
  344. proc            GetEditSeg near
  345.                 push    es
  346.                 call    GetInfo
  347.                 xor     ax,ax
  348.                 mov     al,[cs:offset MMus+(offset (SMus).mt_SongPos)]
  349.                 les     di,[cs:offset MMus+(offset (SMus).HeaderLoc)]
  350.                 add     di,ax
  351.         mov    al,[es:di+HS.Sequences]
  352.                 mov     [CurBlock],al
  353.                 mov     ax,[cs:offset MMus+(offset (SMus).EditSeg)]
  354.                 mov     di,[cs:offset MMus+(offset (SMus).EditOfs)]
  355.         mov    es,ax
  356.                 mov     [CurLineSeg],es
  357.                 mov     [CurLineOfs],di
  358.                 pop     es
  359.                 ret
  360. endp            GetEditSeg
  361.  
  362. proc            DisplayNine near
  363.                 push    ds
  364.  
  365.                 mov     ax,MyData
  366.                 mov     ds,ax
  367.                 call    GetEditSeg
  368.         mov    cx,13
  369.         mov    di,959
  370.  
  371.                 mov     bx,[CurLineOfs]
  372.                 mov     es,[CurLineSeg]
  373. @@1:        sub    bx,7*48
  374.                 mov     [TempPos],bx
  375. @@2:            mov     [CurCount],cx
  376.                 push    di
  377.  
  378.                 mov     bx,[TempPos]
  379.         add    bx,48
  380.                 mov     [TempPos],bx
  381.                 js      @@Signed
  382.         cmp    bx,3072-48
  383.                 jg      @@Signed
  384.                 call    MakeOne
  385.  
  386. @@4:            pop     di
  387.                 mov     si,offset PatternLine
  388.         mov    cx,60
  389.                 call    DirectWrite1
  390.         add    di,40
  391.                 mov     cx,[CurCount]
  392.                 loop    @@2
  393.                 jmp     @@Done
  394.  
  395. @@Signed:       pop     di
  396.                 mov     si,offset BlankPatLine
  397.         mov    cx,60
  398.                 call    DirectWrite1
  399.         add    di,40
  400.                 mov     cx,[CurCount]
  401.                 loop    @@2
  402.  
  403. @@Done:         pop     ds
  404.                 ret
  405. endp            DisplayNine
  406.  
  407. proc            ShowPatMode near
  408.                 mov     ax,MyData
  409.                 mov     ds,ax
  410.                 call    GetInfo
  411. @@AAA:          mov     ax,[cs:offset MMus+(offset (SMus).mt_PatternPos)]
  412.                 cmp     [OldPos],ax
  413.                 jne     @@1
  414.                 ret
  415. @@1:            mov     [OldPos],ax
  416.                 call    DisplayNine
  417.                 call    Ed_Sequence
  418.                 ret
  419. endp            ShowPatMode
  420.  
  421. proc            GetInfo near
  422.         mov    bx,9
  423.         mov    cx,1
  424.         mov    si,seg MMus
  425.         mov    di,offset MMus
  426.         call    [dword cs:Music]
  427.         ret
  428. endp        GetInfo
  429.  
  430. proc            SetInfo near
  431.         mov    bx,0Ah
  432.         mov    si,seg MMus
  433.         mov    di,offset MMus
  434.         call    [dword cs:Music]
  435.                 ret
  436. endp        SetInfo
  437.  
  438. proc            FlipChannel near
  439.         mov    al,[es:bx+MS.MasterVolume]
  440.         or    al,al
  441.         jne    @@TurnItOff
  442.         mov    al,[cs:offset MMus+(offset (SMus).MaxVolume)]
  443.         mov    [es:bx+MS.MasterVolume],al
  444.         call    DisplayChannel
  445.         ret
  446. @@TurnItOff:
  447.         mov    [Byte es:bx+MS.MasterVolume],0
  448.         call    DisplayChannel
  449.         ret
  450. endp        FlipChannel
  451.  
  452. proc            DisplayChannel near
  453.         push    es
  454.         mov    di,(Seq_Row*80+49)*2-1
  455.         les    bx,[cs:offset MMus+(offset (SMus).ChannelLoc)]
  456.         call    Channel_WriteIt
  457.         add    di,4
  458.         add    bx,size MS
  459.         call    Channel_WriteIt
  460.         add    di,4
  461.         add    bx,size MS
  462.         call    Channel_WriteIt
  463.         add    di,4
  464.         add    bx,size MS
  465.         call    Channel_WriteIt
  466.         add    di,4
  467.         call    Ed_Percent
  468.                 pop     es
  469.         ret
  470. endp        DisplayChannel
  471.  
  472. proc            Channel_WriteIt near
  473.         cmp    [es:bx+MS.MasterVolume],0
  474.         je    CW1
  475.         mov    al,0Fh
  476.         jmp    CW2
  477. CW1:        mov    al,01h
  478. CW2:        push    es
  479.         mov    cx,[cs:Screen]
  480.         mov    es,cx
  481.         mov    [es:di],al
  482.         pop    es
  483.         ret
  484. endp        Channel_WriteIt
  485.  
  486. proc            WriteCh near
  487.         push    es
  488.         mov    es,[cs:Screen]
  489.         mov    di,(Ins_Line*80+79)*2
  490.         mov    cx,0
  491. @@Looper:    mov    ax,0
  492.         cmp    cl,[cs:Chan]
  493.         jne    @@Store
  494.         mov    ax,0A11h
  495. @@Store:    mov    [es:di],ax
  496.         add    di,160
  497.         inc    cx
  498.         cmp    cx,4
  499.         jne    @@Looper
  500.         pop    es
  501.         ret
  502. endp            WriteCh
  503.  
  504. proc            Ed_PlayStatus near
  505.         push    es
  506.         mov    es,[cs:Screen]
  507.         mov    di,(24*80+1)*2
  508.         mov    ax,0A0Fh
  509.         cmp    [Byte cs:offset MMus+(offset (SMus).PlayStatus)],1
  510.         je    @@Store
  511.         mov    ax,0
  512. @@Store:    stosw
  513.         pop    es
  514.         ret
  515. endp        Ed_PlayStatus
  516.  
  517. proc            DoVolBar near
  518.         push    ds es
  519.         mov    di,(Ins_Line*80+Vol_Column)*2-1
  520.         lds    bx,[cs:offset MMus+(offset (SMus).ChannelLoc)]
  521.         mov    cx,0
  522. @@Looper:    push    cx di
  523.         mov    ax,0EFEh
  524.         xor    ch,ch
  525.         mov    cl,[ds:bx+MS.DecVolume]
  526.                 shr     cx,1
  527.         mov    dx,cx
  528.                 or      cx,cx
  529.         je    @@DoEnd
  530.         mov    al,254
  531.         call    DirectWrite2
  532. @@DoEnd:    mov    cx,32
  533.         sub    cl,dl
  534.         or    cx,cx
  535.         je    @@EndOfChannel
  536.         mov    al,0
  537.         call    DirectWrite2
  538. @@EndOfChannel: pop     di
  539.         add    di,160
  540.         add    bx,size MS
  541.         pop    cx
  542.         inc    cx
  543.         cmp    cx,4
  544.         jne    @@Looper
  545.         pop    es ds
  546.         ret
  547. endp        DoVolBar
  548.  
  549. ; CX - Instrument to write.
  550. proc            WriteIns near
  551.         push    ds bx
  552.         mov    ax,cs
  553.         mov    ds,ax
  554.         mov    si,offset samples
  555. ;         lds     si,[cs:offset MMus+(offset (SMus).HeaderLoc)]
  556. ;         add     si,(offset (HS).Samples)
  557.         mov    ax,size SampleRec
  558.         mul    cx
  559.         add    si,ax
  560.         mov    cx,22
  561.                 mov     ah,0Fh
  562. @@StoreLoop:    lodsb
  563.                 stosw
  564.                 loop    @@StoreLoop
  565.         pop    bx ds
  566.                 ret
  567. endp        WriteIns
  568.  
  569. proc            WriteAllIns near
  570.         push    ds
  571.                 mov     es,[cs:Screen]
  572.         mov    di,(Ins_Line*80+Name_Col)*2
  573.         lds    bx,[cs:offset MMus+(offset (SMus).ChannelLoc)]
  574.         mov    cx,0
  575. @@Looper:    push    cx di
  576.         xor    ch,ch
  577.         mov    cl,[ds:bx+MS.SampleNum]
  578.         call    WriteIns
  579.         pop    di
  580.         add    di,160
  581.         pop    cx
  582.         add    bx,size MS
  583.         inc    cx
  584.         cmp    cx,4
  585.         jne    @@Looper
  586.         pop    ds
  587.         ret
  588. endp        WriteAllIns
  589.  
  590. include     "sd.asm"
  591. include     "env.asm"
  592. include     "cmdline.asm"
  593. include     "config.asm"
  594.  
  595. proc            Terminate near
  596.         mov    bx,5
  597.         call    [dword ptr cs:Music]
  598.         mov    bx,1        ; Close down player.
  599.         call    [dword ptr cs:Music]
  600.         mov    ax,MyData
  601.                 mov     ds,ax
  602.                 mov     ah,0Eh
  603.                 mov     dl,[OldDrive]
  604.                 int     21h
  605.                 mov     ah,3Bh
  606.                 mov     dx,offset HomeDirectory - 1
  607.                 int     21h
  608.                 mov     ax,4C00h
  609.                 int     21h
  610. endp            Terminate
  611.  
  612. proc            SetGrMode near
  613.         mov    ax,13h
  614.                 int     10h
  615.         mov    dx,3c8h
  616.         mov    al,0
  617.         out    dx,al
  618.         inc    dl
  619.         mov    cx,768
  620.         mov    al,0
  621. @@PutLoop:    out    dx,al
  622.         loop    @@PutLoop
  623.                 ret
  624. endp            SetGrMode
  625.  
  626. VoiceList    dw    20*320+16,20*320+174,123*320+174,123*320+16
  627. CurOsc        dw    0
  628. CurOscOfs    dw    0
  629. OscData     db    1040 dup (0)
  630. proc            Osc near
  631.         push    ds
  632.         lds    bx,[cs:offset MMus+(offset (SMus).ChannelLoc)]
  633.         mov    dx,0a000h
  634.                 mov     es,dx
  635.         mov    cx,0
  636.         mov    [Word cs:CurOscOfs],0
  637. @@PLoop:    push    cx        ; Channels
  638.         push    ds bx        ; ChannelLoc Pointer
  639.         mov    si,[cs:CurOsc]
  640. ;         mov     al,[ds:bx+MS.volume]
  641. ;         mul     [Byte ds:bx+MS.MasterVolume]
  642. ;         mov     al,ah
  643. ;         push     ax
  644.         cmp    [ds:bx+MS.MasterVolume],0
  645.         jnz    @@GetIt
  646.         mov    al,0
  647.         mov    bx,0
  648.         jmp    @@Skip2
  649. @@GetIt:    mov    al,[ds:bx+MS.sc_Voice]
  650.         mov    bx,0Bh
  651.         push    si        ; Save CurOsc
  652.         call    [dword cs:Music]
  653.         mov    ax,si
  654.         pop    si
  655. @@Skip2:  ;     pop     bx
  656. ;         imul     bl
  657. ;         mov     al,ah
  658.         xor    al,80h
  659.         shr    al,2        ; 0-63 range
  660.         add    si,[cs:CurOscOfs]    ; CurOscOfs+CurOsc
  661.         xor    ah,ah        ; Byte to screen
  662.         inc    al
  663.         mov    bx,cx        ; Channel
  664.         shl    bx,1        ;  *2
  665.         mov    cx,320        ; Byte * 320
  666.         mul    cx
  667.         mov    di,ax        ; Destination = Byte * 320
  668.         add    di,[cs:bx+VoiceList]    ; Destination + Screen Offset
  669.         mov    cx,[cs:CurOsc]    ; CurOsc / 2
  670.         shr    cx,1
  671.         add    di,cx        ; Destination + CurOsc/2
  672.         mov    dx,[Word cs:si+OscData]       ; Get Old VGA Loc
  673.                 cmp     di,dx           ; Are they the same?
  674.         jz    @@SkipIt    ; Yes.
  675.         xchg    di,dx        ; Kill the one.
  676.                 xor     [Byte es:di],00100000b
  677.         xchg    di,dx        ; Store the other.
  678.                 xor     [Byte es:di],00100000b
  679. @@SkipIt:    mov    [Word cs:si+OscData],di       ; Save New dest.
  680.         pop    bx ds        ; Pop ChannelLoc Pointer
  681.         pop    cx        ; Pop Channels
  682.         add    bx,size MS    ; Next structure.
  683.         add    [Word cs:CurOscOfs],260
  684.         inc    cx
  685.         cmp    cx,4
  686.         jne    @@PLoop
  687.         add    [Word cs:CurOsc],2
  688.         cmp    [Word cs:CurOsc],130*2-1 ;Are we at end of the oscilloscope display?
  689.         jb    @@Skip
  690.         mov    [Word cs:CurOsc],0
  691. @@Skip:     pop    ds
  692.         ret
  693. endp        Osc
  694.  
  695. assume          ds:MyData
  696.  
  697. proc            Error near
  698.                 mov     ax,MyData
  699.         mov    ds,ax
  700.         call    RestoreMode
  701.                 mov     ah,9
  702.                 int     21h
  703.         mov    ah,0
  704.         int    16h
  705.                 call    Terminate
  706. endp            Error
  707.  
  708. ; si - Filename offset
  709. proc            PutName
  710.         push    ds es
  711.         mov    ax,MyData
  712.                 mov     es,ax
  713.         mov    di,[es:PutFilename]
  714.         mov    ax,cs
  715.                 mov     ds,ax
  716.                 mov     cx,12
  717.         rep    movsb
  718.         mov    al,0
  719.         stosb
  720.         pop    es ds
  721.         ret
  722. endp            PutName
  723.  
  724. proc        DisplayTextScreen
  725.         call    SetMode
  726.         mov    si,offset ScreenFile
  727.                 call    PutName
  728.         mov    dx,offset GDirectory
  729.                 mov     cx,seg GDirectory
  730.                 push    ds
  731.                 mov     ds,cx
  732.                 mov     ax,3D00h
  733.                 int     21h
  734.                 jb      @@NoFind
  735.                 pop     ds
  736.                 mov     bx,ax
  737.                 push    bx
  738.                 call    GetDecodeSizes
  739.                 pop     bx
  740.         mov    ax,[cs:Screen]
  741.                 mov     es,ax
  742.                 mov     di,0
  743.                 push    bx
  744.                 call    Decode
  745.                 pop     bx
  746.                 mov     ah,3Eh
  747.                 int     21h
  748.         call    WriteAltScrn1
  749.         call    WriteCh
  750.         ret
  751. @@NoFind:    pop    ds
  752.         ret
  753. endp            DisplayTextScreen
  754.  
  755. proc        DisplayGraph
  756.         mov    si,offset GraphFile
  757.                 call    PutName
  758.         mov    dx,offset GDirectory
  759.                 mov     cx,seg GDirectory
  760.                 push    ds
  761.                 mov     ds,cx
  762.                 mov     ax,3D00h
  763.                 int     21h
  764.                 jb      @@NoFind
  765.                 pop     ds
  766.                 mov     bx,ax
  767.                 push    bx
  768.                 call    SetGrMode
  769.                 pop     bx
  770.                 push    bx
  771.                 call    GetDecodeSizes
  772.                 pop     bx
  773.                 mov     ax,0A000h
  774.                 mov     es,ax
  775.                 mov     di,0
  776.                 push    bx
  777.                 call    Decode
  778.                 pop     bx
  779.                 mov     ah,3Eh
  780.                 int     21h
  781.                 mov     dx,3c8h
  782.                 mov     al,0
  783.                 out     dx,al
  784.                 inc     dl
  785.                 mov     cx,768
  786.                 push    ds es
  787.                 mov     ax,0A000h
  788.                 mov     ds,ax
  789.                 mov     si,64000
  790. @@PutLoop:      lodsb
  791.                 out     dx,al
  792.                 loop    @@PutLoop
  793.                 mov     ax,cs
  794.                 mov     es,ax
  795.                 mov     di,offset OscData
  796.                 mov     cx,130*4
  797.                 mov     ax,0
  798.                 rep     stosw
  799.                 pop     es ds
  800.                 mov     [Word cs:CurOsc],0
  801.         ret
  802. @@NoFind:    mov    [Byte cs:Mode],0
  803.         call    DisplayTextScreen
  804.         ret
  805. endp            DisplayGraph
  806.  
  807. proc        DisplaySpectrum
  808. ;         call     SetGrMode
  809. ;         call     ClearAna
  810. ;         mov     ax,13h
  811. ;         int     10h
  812.         ret
  813. endp        DisplaySpectrum
  814.  
  815. AnaSave     dw    44 dup (0)
  816. ;AnaOfs      dw     0,320,640,960,1280,1600
  817. ;         dw
  818. ;         dw
  819. ;         dw
  820. ;         dw
  821.         dw    000F0h
  822.  
  823. proc        ClearAna
  824.         ret
  825.         push    ds
  826.         cli
  827.         lds    si,[cs:offset MMus+(offset (SMus).AnalyzerLoc)]
  828.                 mov     bp,offset AnaSave
  829.         mov    cx,22
  830. cahloop:    mov    [Word si],0
  831.         mov    [Word cs:bp],0
  832.         add    si,2
  833.         add    bp,2
  834.         loop    cahloop
  835.         sti
  836.         pop    ds
  837.                 ret
  838. endp            ClearAna
  839.  
  840. proc            DoSpectrum
  841.         ret
  842.         push    ds
  843.         lds    si,[cs:offset MMus+(offset (SMus).AnalyzerLoc)]
  844.         mov    bp,offset AnaSave
  845.         mov    ax,0A000h
  846.         mov    es,ax
  847.         mov    di,(199-36)*320
  848.         mov    cx,22
  849. spanlab1:    push    cx
  850.         push    di
  851.         mov    bx,[si]
  852.         add    si,2
  853.         cmp    bx,36
  854.         jb    spanskip2
  855.         mov    bx,36
  856. spanskip2:    mov    cx,[cs:bp]
  857.         add    bp,2
  858.         cmp    cx,bx
  859.         jz    spanskip3
  860.         jb    span_r2
  861.         mov    ax,32
  862.         sub    ax,cx
  863.         mov    cx,ax
  864. ;                sub     cx,bx
  865.         dec    cx
  866.         mov    ax,320
  867.         mul    bx
  868. ;         add     bx,bx
  869.         add    di,ax
  870. ;                mov     di,[cs:bx+AnaOfs]
  871.         mov    bx,cx
  872.         or    bx,bx
  873.         jz    spanskip3
  874.         mov    ax,0E0Eh
  875. spanloop:       mov     cx,3
  876.         rep    stosw
  877.         sub    di,320+6
  878.         dec    bx
  879.         jnz    spanloop
  880.         jmp    spanskip3
  881. span_r2:    sub    bx,cx
  882.         dec    bx
  883. ;         shl     cx,1
  884.         mov    ax,320
  885.         mul    cx
  886.                 add     di,ax
  887. ;                mov     di,[cs:bx+AnaOfs]
  888.         or    bx,bx
  889.         jz    spanskip3
  890.         mov    ax,0F0Fh
  891. spanloop2:      mov     cx,3
  892.         rep    stosw
  893.         sub    di,320+6
  894.         dec    bx
  895.         jnz    spanloop2
  896. spanskip3:    pop    di
  897.         add    di,7
  898.         pop    cx
  899.         loop    spanlab1
  900.         lds    si,[cs:offset MMus+(offset (SMus).AnalyzerLoc)]
  901.                 mov     bp,offset AnaSave
  902.         mov    cx,22
  903. spanloop3:    mov    bx,[si]
  904.         mov    [cs:bp],bx
  905.         add    bp,2
  906.         or    bx,bx
  907.         jz    spanskip4
  908.         dec    bx
  909. spanskip4:    mov    [si],bx
  910.         add    si,2
  911.         loop    spanloop3
  912.         pop    ds
  913.         ret
  914.  
  915.  
  916. ;@@DrawLarge:     push     cx
  917. ;         push     di
  918. ;         mov     bx,[si]
  919. ;         xor     bh,bh
  920. ;         and     bx,36
  921. ;         mov     dx,bx
  922. ;         or     bx,bx
  923. ;         jz     @@ClearUp
  924. ;         mov     ax,0F0Fh
  925. ;@@DrawUp:     mov     cx,3
  926. ;         rep     stosw
  927. ;         sub     di,320+6
  928. ;         dec     bx
  929. ;         jnz     @@DrawUp
  930. ;@@ClearUp:     mov     bx,36
  931. ;;          sub      bx,dx
  932. ;         or     bx,bx
  933. ;         jz     @@ClearDone
  934. ;         mov     ax,0000h
  935. ;@@DrawCUp:     mov     cx,3
  936. ;         rep     stosw
  937. ;         sub     di,320+320+6
  938. ;         dec     bx
  939. ;         jnz     @@DrawCUp
  940. ;@@ClearDone:     sub     [Word si],1
  941. ;         add     si,2
  942. ;         pop     di
  943. ;         add     di,7
  944. ;         pop     cx
  945. ;         loop     @@DrawLarge
  946. ;         pop     ds
  947. ;         ret
  948. endp            DoSpectrum
  949.  
  950. include     "gmodfile.asm"
  951.  
  952. proc        LoadFile
  953.                 call    FileSelect
  954.                 jb      @@EndError
  955.                 mov     cx,cs
  956.                 mov     si,offset P
  957.                 mov     bx,5
  958.                 call    [dword ptr cs:Music]
  959.         mov    cx,es
  960.                 call    MUS_LoadModule
  961.                 call    GetInfo
  962.                 mov     [Byte cs:offset MMus+(offset (SMus).mt_speed)],6
  963.                 mov     [Byte cs:offset MMus+(offset (SMus).mt_counter)],5
  964.                 mov     cx,0
  965.                 call    SetInfo
  966. @@End:          clc
  967.                 ret
  968. @@EndError:    call    RestoreMode
  969.                 call    Terminate
  970.         stc
  971.                 ret
  972. endp            LoadFile
  973.  
  974. proc            FileSelect
  975.                 mov     di,55
  976.                 mov     bx,0
  977.                 mov     ah,1Fh
  978.                 mov     al,1
  979.                 mov     cx,24
  980.         mov    dx,25
  981.                 call    DrawBox
  982.                 call    DisplayAll
  983.                 mov     ax,MyData
  984.                 mov     ds,ax
  985. @@TopLoop:      mov     ah,0
  986.                 int     16h
  987. ;──────────────────────────────────────────────────────────
  988. @@Key_Up:       cmp     ah,72
  989.                 jne     @@Key_Down
  990.                 cmp     [Word CurFile],0
  991.                 jz      @@Beep
  992.                 dec     [Word CurFile]
  993.                 mov     bx,[CurFile]
  994.                 sub     bx,[TopFile]
  995.                 jns     @@PrintIt
  996.                 dec     [Word TopFile]
  997.                 jmp     @@PrintIt
  998. ;──────────────────────────────────────────────────────────
  999. @@Key_Down:     cmp     ah,80
  1000.                 jne     @@Key_Home
  1001.                 mov     bx,[NumFiles]
  1002.                 dec     bx
  1003.                 cmp     [CurFile],bx
  1004.                 jz      @@Beep
  1005.                 inc     [Word CurFile]
  1006.                 mov     bx,[CurFile]
  1007.                 sub     bx,[TopFile]
  1008.         cmp    bx,23
  1009.                 jl      @@PrintIt
  1010.                 inc     [Word TopFile]
  1011.                 jmp     @@PrintIt
  1012. ;──────────────────────────────────────────────────────────
  1013. @@Key_Home:     cmp     ah,71
  1014.                 jne     @@Key_End
  1015.                 cmp     [Word CurFile],0
  1016.                 jnz     @@SetTop
  1017.                 cmp     [Word TopFile],0
  1018.                 jz      @@Beep
  1019. @@SetTop:       mov     [Word CurFile],0
  1020.                 mov     [Word TopFile],0
  1021.                 jmp     @@PrintIt
  1022. ;──────────────────────────────────────────────────────────
  1023. @@Key_End:      cmp     ah,79
  1024.                 jne     @@Key_PgUp
  1025.                 mov     bx,[NumFiles]
  1026.                 dec     bx
  1027.                 cmp     [CurFile],bx
  1028.                 jnz     @@SetBottom
  1029.                 sub     bx,[TopFile]
  1030.         cmp    bx,23
  1031.                 jl      @@Beep
  1032. @@SetBottom:    mov     bx,[NumFiles]
  1033.                 dec     bx
  1034.                 mov     [CurFile],bx
  1035.         sub    bx,22
  1036.                 js      @@FixBottom
  1037.                 mov     [TopFile],bx
  1038.                 jmp     @@PrintIt
  1039. @@FixBottom:    mov     [Word TopFile],0
  1040.                 jmp     @@PrintIt
  1041. ;──────────────────────────────────────────────────────────
  1042. @@Key_PgUp:     cmp     ah,73
  1043.                 jne     @@Key_PgDn
  1044.                 cmp     [Word CurFile],0
  1045.                 jz      @@Beep
  1046.         sub    [Word CurFile],23
  1047.                 js      @@FixPgUp
  1048.         sub    [Word TopFile],23
  1049.                 js      @@FixPgUp2
  1050.                 jmp     @@PrintIt
  1051. @@FixPgUp:      mov     [Word CurFile],0
  1052. @@FixPgUp2:     mov     [Word TopFile],0
  1053.                 jmp     @@PrintIt
  1054. ;──────────────────────────────────────────────────────────
  1055. @@Key_PgDn:     cmp     ah,81
  1056.                 jne     @@Key_Enter
  1057.                 mov     dx,[NumFiles]
  1058.                 dec     dx
  1059.                 cmp     [CurFile],dx
  1060.                 jz      @@Beep
  1061.         add    [Word CurFile],23
  1062.                 cmp     [CurFile],dx
  1063.                 jg      @@FixPgDn
  1064.         add    [Word TopFile],23
  1065.                 cmp     [Word TopFile],dx
  1066.                 jg      @@FixPgDn2
  1067.                 jmp     @@PrintIt
  1068. @@FixPgDn:      mov     [Word CurFile],dx
  1069. @@FixPgDn2:    sub    dx,22
  1070.                 js      @@FixPgDn3
  1071.                 mov     [TopFile],dx
  1072.                 jmp     @@PrintIt
  1073. @@FixPgDn3:     mov     [Word TopFile],0
  1074.                 jmp     @@PrintIt
  1075. ;──────────────────────────────────────────────────────────
  1076. @@Key_Enter:    cmp     al,13
  1077.                 jnz     @@Key_Esc
  1078.                 call    SelectFile
  1079.                 jnb     @@End
  1080.                 clc
  1081.                 ret
  1082. ;──────────────────────────────────────────────────────────
  1083. @@Key_Esc:      cmp     ah,1
  1084.                 jnz     @@End
  1085.                 stc
  1086.                 ret
  1087. ;──────────────────────────────────────────────────────────
  1088. @@Beep:         clc
  1089.                 jmp     @@End
  1090. ;──────────────────────────────────────────────────────────
  1091. @@PrintIt:      call    DisplayAll
  1092.                 clc
  1093.                 jmp     @@End
  1094. ;──────────────────────────────────────────────────────────
  1095. @@End:          jmp     @@TopLoop
  1096. endp            FileSelect
  1097.  
  1098. proc            SelectFile
  1099.                 push    ds
  1100.                 mov     ax,size FStruc
  1101.                 mul     [CurFile]
  1102.                 lds     di,[FileSeg]
  1103.                 add     di,ax
  1104.                 mov     dx,di
  1105.                 cmp     [di+FStruc.TypeOfFile],F_Directory
  1106.                 jnz     @@MustBeAModule
  1107.                 mov     AH,3Bh
  1108.                 int     21h             ;2-Change_Directory
  1109.                 call    ReadFiles
  1110.                 call    DisplayAll
  1111.                 pop     ds
  1112.                 clc
  1113.                 ret
  1114. @@MustBeAModule:
  1115.                 mov     ax,ds
  1116.                 mov     es,ax
  1117.                 pop     ds
  1118.                 stc
  1119.                 ret
  1120. endp            SelectFile
  1121.  
  1122. ;                Mode    =  0    -->  Outline
  1123. ;                           1    -->  Fill
  1124. ; cx - SizeX
  1125. ; dx - SizeY
  1126. ; ah - Color
  1127. ; al - Mode
  1128. ; di - X
  1129. ; bx - Y
  1130. proc            DrawBox
  1131.                 push    es ax dx
  1132.                 mov     ax,[cs:Screen]
  1133.                 mov     es,ax
  1134.                 add     di,di
  1135.                 mov     ax,160
  1136.                 mul     bx
  1137.                 add     di,ax
  1138.  
  1139.                 mov     bx,160
  1140.                 sub     bx,cx
  1141.                 sub     bx,cx
  1142.  
  1143.                 cld
  1144.                 pop     dx ax
  1145.                 cmp     al,1
  1146.                 jne     @@OutlineTop
  1147.                 mov     al,' '
  1148. @@FillLoop:     push    cx
  1149.                 rep     stosw
  1150.                 add     di,bx
  1151.                 pop     cx
  1152.                 dec     dx
  1153.                 jnz     @@FillLoop
  1154.                 jmp     @@Done
  1155.  
  1156. @@OutlineTop:   push    cx
  1157.                 rep     stosb
  1158.                 add     di,bx
  1159.                 pop     cx
  1160. @@OutlineSides: stosb
  1161.                 add     di,cx
  1162.                 sub     di,2
  1163.                 stosb
  1164.                 add     di,bx
  1165.                 dec     dx
  1166.                 cmp     dx,2
  1167.                 jne     @@OutlineSides
  1168.  
  1169. @@OutlineBottom:pop     cx
  1170.                 rep     stosb
  1171.  
  1172. @@Done:         pop     es
  1173.                 ret
  1174. endp            DrawBox
  1175.  
  1176.  
  1177. ScreenF         db      'SCREEN.BIN',0
  1178.  
  1179. PspAddress      dw      ?
  1180. SizeOfProg      dw      ?
  1181. TopOfData    dw    ?
  1182.  
  1183. proc        Main
  1184. Start:          mov     [cs:PspAddress],es
  1185.                 mov     ax,zzzzzseg
  1186.                 inc     ax
  1187.                 mov     [cs:TopOfData],ax
  1188.  
  1189.         call    HowMuchMemory
  1190.         call    DetermineDisplay
  1191.         mov    ax,MyData
  1192.                 mov     ds,ax
  1193.                 mov     ah,47h
  1194.                 mov     dl,0
  1195.                 mov     si,offset HomeDirectory
  1196.                 int     21h
  1197.                 mov     ah,19h
  1198.                 int     21h
  1199.                 mov     [OldDrive],al
  1200.  
  1201.         ; ──── write title
  1202.         mov    ax,MyData
  1203.         mov    ds,ax
  1204.         mov    ah,9
  1205.         mov    dx,offset GusmodTitle
  1206.         int    21h
  1207.  
  1208.         call    SetEnv
  1209. @@LoadDriver:   mov     si,offset SoundFile
  1210.         call    PutName
  1211.         mov    dx,offset GDirectory
  1212.         mov    cx,seg GDirectory
  1213.                 call    LoadSoundDriver
  1214.         jnb    @@DriverLoaded
  1215.         mov    dx,offset NoDriverFound
  1216.                 call    Error
  1217. @@DriverLoaded: call    ReadGConfig
  1218.         mov    ax,[cs:GUSIRQ]
  1219.                 mov     bx,0
  1220.         mov    cx,[cs:GUSMIDI]
  1221.         mov    dx,[cs:GUSPort]
  1222.         mov    si,[cs:DMAIn]
  1223.         mov    di,[cs:DMAOut]
  1224.         call    [dword ptr cs:Music]
  1225.                 jnb     @@FoundCard
  1226.         mov    dx,offset NoGUS
  1227.         call    Error
  1228. @@FoundCard:    mov    [cs:GUSIRQ],si
  1229.         mov    [cs:GUSPort],di
  1230.         call    LoadCommandLine
  1231.  
  1232.         cmp    [Byte cs:Interactive],0
  1233.         jz    @@LoadItFromLine
  1234.         mov    ax,MyData
  1235.                 mov     ds,ax
  1236.                 xor     dx,dx
  1237.                 mov     ax,size FStruc
  1238.                 mov     bx,[MaxFiles]
  1239.                 mul     bx
  1240.                 mov     bx,ax
  1241.                 shr     bx,4
  1242.                 add     bx,1
  1243.         mov    ax,[cs:TopOfData]
  1244.         mov    [Word FileSeg+2],ax
  1245.                 mov     [Word FileSeg],0
  1246.         add    [Word cs:TopOfData],bx
  1247.         call    ReadFiles
  1248.  
  1249.                 mov     ax,[cs:TopOfData]
  1250.         mov    [cs:MusBuf],ax
  1251.         add    [Word cs:TopOfData],4096/16
  1252.         mov    ax,[cs:TopOfData]
  1253.         mov    [cs:TopOfMusic],ax
  1254.  
  1255. @@InteractiveTop:
  1256.         call    LoadFile
  1257.         jb    @@nofile
  1258.         jmp    @@BeginPlay
  1259.  
  1260. @@LoadItFromLine:
  1261.         mov    ax,[cs:TopOfData]
  1262.         mov    [cs:MusBuf],ax
  1263.                 add     [Word cs:TopOfData],4096/16
  1264.                 ; Load the module.
  1265.         mov    cx,ds
  1266.         mov    dx,130
  1267.         call    MUS_LoadModule
  1268.         jb    @@nofile
  1269.         jmp    @@BeginPlay
  1270.  
  1271. @@noargv:    mov    dx,offset NoFileName
  1272.         call    Error
  1273. @@nofile:    mov    dx,offset NoFileFound
  1274.         call    Error
  1275. @@BeginPlay:    mov    si,offset ConfigFile
  1276.                 call    ReadConfig
  1277.  
  1278.         mov    [Word cs:offset P+(offset (PM).MusBuf)],0
  1279.         mov    ax,[cs:MusBuf]
  1280.         mov    [Word cs:offset P+(offset (PM).MusBuf)+2],ax
  1281.                 mov     [Word cs:offset P+(offset (PM).Header)],offset PS16Header
  1282.         mov    [Word cs:offset P+(offset (PM).Header)+2],cs
  1283.         mov    [Word cs:offset P+(offset (PM).PatternLoc)],offset PatternLoc
  1284.         mov    [Word cs:offset P+(offset (PM).PatternLoc)+2],cs
  1285.         mov    [Word cs:offset P+(offset (PM).InsLoc)],offset InsLoc
  1286.         mov    [Word cs:offset P+(offset (PM).InsLoc)+2],cs
  1287.         mov    [Word cs:offset P+(offset (PM).mt_speed)],6
  1288.         mov    [Word cs:offset P+(offset (PM).mt_counter)],5
  1289.         mov    [Word cs:offset P+(offset (PM).mt_PatternPos)],0
  1290.         mov    [Word cs:offset P+(offset (PM).mt_SongPos)],0
  1291. @@PlayStart:    mov     cx,cs
  1292.         mov    si,offset P
  1293.         mov    bx,4
  1294.         call    [dword cs:Music]
  1295. @@DisplayScr:    cmp    [cs:Mode],0
  1296.         jnz    @@GraphicDisp
  1297.         call    DisplayTextScreen
  1298.         jmp    @@PollLoop
  1299. @@GraphicDisp:    cmp    [cs:Mode],1
  1300.         jnz    @@GraphicSp
  1301.         call    DisplayGraph
  1302.         jmp    @@PollLoop
  1303. @@GraphicSp:    call    DisplaySpectrum
  1304. @@PollLoop:    mov    bx,0Ch
  1305.         call    [dword cs:Music]
  1306.         cmp    si,1
  1307.         jz    @@MusicDone
  1308.         cmp    [cs:Mode],0
  1309.         jne    @@DoOsc
  1310.         call    ShowPatMode
  1311.         call    WriteAllIns
  1312.         call    DoVolBar
  1313.         jmp    @@CheckKey
  1314. @@DoOsc:    cmp    [Byte cs:Mode],1
  1315.         jne    @@DoSpect
  1316.         call    Osc
  1317.         jmp    @@CheckKey
  1318. @@DoSpect:    call    DoSpectrum
  1319. @@CheckKey:    mov    ah,1
  1320.         int    16h
  1321.         je    @@PollLoop
  1322.                 mov     ah,0
  1323.         int    16h
  1324.         call    GetInfo
  1325. @@Key_F1:       cmp     ah,3Bh
  1326.         jne    @@Key_F2
  1327.                 mov     si,offset ConfigFile
  1328.                 call    WriteConfig
  1329.                 jmp     @@End
  1330. ;──────────────────────────────────────────────────────────
  1331. @@Key_F2:    cmp    ah,3Ch
  1332.                 jne     @@Key_F3
  1333.                 mov     si,offset ConfigFile
  1334.                 call    ReadConfig
  1335.         jmp    @@DisplayScr
  1336. ;──────────────────────────────────────────────────────────
  1337. @@Key_F3:       cmp     ah,3Dh
  1338.                 jne     @@Key_F4
  1339.                 mov     si,offset GTSRConfigFile
  1340.         call    WriteConfig
  1341.                 jmp     @@DisplayScr
  1342. ;──────────────────────────────────────────────────────────
  1343. @@Key_F4:       cmp     ah,3Eh
  1344.                 jne     @@Key_Tab
  1345.                 mov     si,offset GTSRConfigFile
  1346.                 call    ReadConfig
  1347.                 jmp     @@DisplayScr
  1348. ;──────────────────────────────────────────────────────────
  1349. @@Key_Tab:    cmp    al,9
  1350.         jne    @@Key_Space
  1351.         inc    [Byte cs:Mode]
  1352.         and    [Byte cs:Mode],1
  1353.         cmp    [Byte cs:Mode],1
  1354.         jz    @@GraphicScope
  1355.         cmp    [Byte cs:Mode],2
  1356.         jz    @@GraphicSpectrum
  1357.         cmp    [cs:Mode],0
  1358.         jne    @@GraphicScope
  1359.         call    DisplayTextScreen
  1360.         jmp    @@End
  1361. @@GraphicScope: call    DisplayGraph
  1362.         jmp    @@End
  1363. @@GraphicSpectrum:
  1364.         call    DisplaySpectrum
  1365.         jmp    @@End
  1366. ;──────────────────────────────────────────────────────────
  1367. @@Key_Space:    cmp    al,' '
  1368.         jne    @@Key_Plus
  1369.         call    GetInfo
  1370.         xor    [Byte cs:offset MMus+(offset (SMus).PlayStatus)],1
  1371.         call    Ed_PlayStatus
  1372.                 mov     cx,00000010b
  1373.                 call    SetInfo
  1374.         jmp    @@End
  1375. ;──────────────────────────────────────────────────────────
  1376. @@Key_Plus:     cmp     al,'='
  1377.         jne    @@Key_Minus
  1378.         call    GetInfo
  1379.         cmp    [Byte cs:offset MMus+(offset (SMus).MaxVolume)],255
  1380.         je    @@Key_Plus_1
  1381.         inc    [Byte cs:offset MMus+(offset (SMus).MaxVolume)]
  1382.         mov    cx,00000001b
  1383.                 call    SetInfo
  1384.         call    Ed_Percent
  1385. @@Key_Plus_1:   jmp     @@End
  1386. ;──────────────────────────────────────────────────────────
  1387. @@Key_Minus:    cmp     al,'-'
  1388.         jne    @@Key_Up
  1389.         call    GetInfo
  1390.         cmp    [Byte cs:offset MMus+(offset (SMus).MaxVolume)],0
  1391.         je    @@Key_Plus_1
  1392.         dec    [Byte cs:offset MMus+(offset (SMus).MaxVolume)]
  1393.         mov    cx,00000001b
  1394.                 call    SetInfo
  1395.         call    Ed_Percent
  1396. @@Key_Minus_1:  jmp     @@End
  1397. ;──────────────────────────────────────────────────────────
  1398. @@Key_Up:    cmp    ah,72
  1399.         jne    @@Key_Down
  1400.         cmp    [Byte cs:Chan],0
  1401.         je    @@Key_Up_1
  1402.         dec    [Byte cs:Chan]
  1403.         call    WriteCh
  1404. @@Key_Up_1:    jmp    @@End
  1405. ;──────────────────────────────────────────────────────────
  1406. @@Key_Down:    cmp    ah,80
  1407.         jne    @@Key_Left
  1408.         cmp    [Byte cs:Chan],3
  1409.         je    @@Key_Down_1
  1410.         inc    [Byte cs:Chan]
  1411.         call    WriteCh
  1412. @@Key_Down_1:    jmp    @@End
  1413. ;──────────────────────────────────────────────────────────
  1414. @@Key_Left:    cmp    ah,75
  1415.         jne    @@Key_Right
  1416.         call    GetInfo
  1417.         les    bx,[cs:offset MMus+(offset (SMus).ChannelLoc)]
  1418.         mov    ax,size MS
  1419.         xor    ch,ch
  1420.         mov    cl,[cs:Chan]
  1421.         mul    cx
  1422.                 add     bx,ax
  1423.                 cmp     [es:bx+MS.sc_PanPosition],0
  1424.         je    @@Key_Left_1
  1425.         cli
  1426.         dec    [Byte es:bx+MS.sc_PanPosition]
  1427.         sti
  1428.         call    Ed_Pan
  1429. @@Key_Left_1:   jmp     @@End
  1430. ;──────────────────────────────────────────────────────────
  1431. @@Key_Right:    cmp    ah,77
  1432.         jne    @@Key_LBrack
  1433.         call    GetInfo
  1434.         les    bx,[cs:offset MMus+(offset (SMus).ChannelLoc)]
  1435.         mov    ax,size MS
  1436.         xor    ch,ch
  1437.         mov    cl,[cs:Chan]
  1438.         mul    cx
  1439.         add    bx,ax
  1440.         cmp    [es:bx+MS.sc_PanPosition],15
  1441.         je    @@Key_Right_1
  1442.         cli
  1443.         inc    [Byte es:bx+MS.sc_PanPosition]
  1444.         sti
  1445.         call    Ed_Pan
  1446. @@Key_Right_1:  jmp     @@End
  1447. ;──────────────────────────────────────────────────────────
  1448. @@Key_LBrack:    cmp    al,'['
  1449.         jne    @@Key_RBrack
  1450.         call    GetInfo
  1451.         les    bx,[cs:offset MMus+(offset (SMus).ChannelLoc)]
  1452.         mov    ax,size MS
  1453.         xor    ch,ch
  1454.         mov    cl,[cs:Chan]
  1455.         mul    cx
  1456.                 add     bx,ax
  1457.         cmp    [es:bx+MS.MasterVolume],0
  1458.         je    @@Key_LBrack_1
  1459.         cli
  1460.         dec    [Byte es:bx+MS.MasterVolume]
  1461.         sti
  1462.         call    Ed_Percent
  1463. @@Key_LBrack_1: jmp    @@End
  1464. ;──────────────────────────────────────────────────────────
  1465. @@Key_RBrack:    cmp    al,']'
  1466.         jne    @@Key_Home
  1467.         call    GetInfo
  1468.         les    bx,[cs:offset MMus+(offset (SMus).ChannelLoc)]
  1469.         mov    ax,size MS
  1470.         xor    ch,ch
  1471.         mov    cl,[cs:Chan]
  1472.         mul    cx
  1473.         add    bx,ax
  1474.         mov    al,[cs:offset MMus+(offset (SMus).MaxVolume)]
  1475.         cmp    [es:bx+MS.MasterVolume],al
  1476.         je    @@Key_RBrack_1
  1477.         cli
  1478.         inc    [Byte es:bx+MS.MasterVolume]
  1479.         sti
  1480.         call    Ed_Percent
  1481. @@Key_RBrack_1: jmp    @@End
  1482. ;──────────────────────────────────────────────────────────
  1483. @@Key_Home:     cmp     ah,71
  1484.         jne    @@Key_End
  1485.         mov    [Word cs:offset MMus+(offset (SMus).mt_PatternPos)],0
  1486.         mov    cx,00000010b
  1487.                 call    SetInfo
  1488.                 call    DisplayNine
  1489.         jmp    @@End
  1490. ;──────────────────────────────────────────────────────────
  1491. @@Key_End:    cmp    ah,79
  1492.         jne    @@Key_PgUp
  1493.         mov    [Word cs:offset MMus+(offset (SMus).mt_PatternPos)],3F0h
  1494.         mov    cx,00000010b
  1495.                 call    SetInfo
  1496.                 call    DisplayNine
  1497.         jmp    @@End
  1498. ;──────────────────────────────────────────────────────────
  1499. @@Key_PgUp:    cmp    ah,73
  1500.         jne    @@Key_PgDn
  1501.         cmp    [Byte cs:MMus+(offset (SMus).mt_SongPos)],0
  1502.         je    @@Key_F7_1
  1503.         dec    [Byte cs:offset MMus+(offset (SMus).mt_SongPos)]
  1504. @@Key_F7_1:    mov    [Word cs:offset MMus+(offset (SMus).mt_PatternPos)],0
  1505.         mov    cx,00000010b
  1506.                 call    SetInfo
  1507.                 call    GetEditSeg
  1508.         call    DisplayNine
  1509.         call    Ed_Sequence
  1510.         jmp    @@End
  1511. ;──────────────────────────────────────────────────────────
  1512. @@Key_PgDn:    cmp    ah,81
  1513.         jne    @@KeyChannel1
  1514.         mov    al,[cs:offset MMus+(offset (SMus).songlen)]
  1515.         dec    al
  1516.         cmp    [cs:offset MMus+(offset (SMus).mt_SongPos)],al
  1517.         je    @@Key_F8_1
  1518.         inc    [Byte cs:offset MMus+(offset (SMus).mt_SongPos)]
  1519. @@Key_F8_1:    mov    [Word cs:offset MMus+(offset (SMus).mt_PatternPos)],0
  1520.         mov    cx,00000010b
  1521.                 call    SetInfo
  1522.         call    GetEditSeg
  1523.         call    DisplayNine
  1524.         call    Ed_Sequence
  1525.         jmp    @@End
  1526. ;──────────────────────────────────────────────────────────
  1527. @@KeyChannel1:    cmp    al,'1'
  1528.         jne    @@KeyChannel2
  1529.         call    GetInfo
  1530.         les    bx,[cs:offset MMus+(offset (SMus).ChannelLoc)]
  1531.         call    FlipChannel
  1532.         jmp    @@End
  1533.  
  1534. ;──────────────────────────────────────────────────────────
  1535. @@KeyChannel2:    cmp    al,'2'
  1536.         jne    @@KeyChannel3
  1537.         call    GetInfo
  1538.         les    bx,[cs:offset MMus+(offset (SMus).ChannelLoc)]
  1539.         add    bx,size MS
  1540.         call    FlipChannel
  1541.         jmp    @@End
  1542.  
  1543. ;──────────────────────────────────────────────────────────
  1544. @@KeyChannel3:    cmp    al,'3'
  1545.         jne    @@KeyChannel4
  1546.         call    GetInfo
  1547.         les    bx,[cs:offset MMus+(offset (SMus).ChannelLoc)]
  1548.         add    bx,size MS*2
  1549.                 call    FlipChannel
  1550.                 jmp     @@End
  1551.  
  1552. ;──────────────────────────────────────────────────────────
  1553. @@KeyChannel4:    cmp    al,'4'
  1554.         jne    @@NormalKeys
  1555.         call    GetInfo
  1556.         les    bx,[cs:offset MMus+(offset (SMus).ChannelLoc)]
  1557.         add    bx,size MS*3
  1558.                 call    FlipChannel
  1559.                 jmp     @@End
  1560.  
  1561. ;──────────────────────────────────────────────────────────
  1562. @@NormalKeys:    cmp    ah,1
  1563.         je    @@Exit
  1564. @@End:        jmp    @@PollLoop
  1565. @@MusicDone:    cmp    [Byte cs:TerminateFlag],0
  1566.         jz    @@Exit
  1567.         mov    ah,0
  1568.                 int     16h
  1569.         cmp    al,' '
  1570.         jz    @@PlayStart
  1571.         cmp    ah,1
  1572.         je    @@Exit
  1573.         jmp    @@MusicDone
  1574. @@Exit:     cmp    [Byte cs:Interactive],0
  1575.         je    @@NoInteractive
  1576.         mov    ax,[cs:TopOfMusic]
  1577.         mov    [cs:TopOfData],ax
  1578.         jmp    @@InteractiveTop
  1579. @@NoInteractive:call    RestoreMode
  1580.         call    Terminate
  1581. endp            Main
  1582.  
  1583. ends            MyCode
  1584.  
  1585. segment     BlankMusicSeg
  1586.         stc
  1587.         retf
  1588. ends        BlankMusicSeg
  1589.  
  1590. segment         MyData
  1591. GusmodTitle    db    'Gusmod 2.11 By Joshua C. Jensen (CyberStrike of Renaissance)',13,10,'$'
  1592. NoGUS           db      '1: Could not detect a Gravis Ultrasound card.',13,10,'$'
  1593. NoFileName    db    '2: Usage: GUSMOD filename<.mod>',13,10,'$'
  1594. NoFileFound    db    '3: Module not found.',13,10,'$'
  1595. NoDriverFound    db    '4: Sound driver not found.',13,10,'$'
  1596. NoEnvFound    db    '5: The environment variable GUSMOD was not found.',13,10,'$'
  1597. NoGCFound    db    '6: GSETUP.CFG not found.  Run SETUP.',13,10,'$'
  1598.  
  1599. GDirectory      db      120 dup (0)
  1600. GEnv        db    6,"GUSMOD"
  1601. PutFilename    dw    0
  1602.  
  1603. db  '\'
  1604. HomeDirectory   db      80 dup (0)
  1605. OldDrive        db      0
  1606.  
  1607. ARP             db      "   ArpPrPrTonVibT&SV&STrm??8So=VlsJmpVolBrk**ESpd"
  1608. Notes        db    '---C-0C#0D-0D#0E-0F-0F#0G-0G#0A-0A#0B-0'
  1609.         db    'C-1C#1D-1D#1E-1F-1F#1G-1G#1A-1A#1B-1'
  1610.         db    'C-2C#2D-2D#2E-2F-2F#2G-2G#2A-2A#2B-2'
  1611.         db    'C-3C#3D-3D#3E-3F-3F#3G-3G#3A-3A#3B-3'
  1612.         db    'C-4C#4D-4D#4E-4F-4F#4G-4G#4A-4A#4B-4'
  1613.  
  1614. CurLineSeg      dw      0
  1615. CurLineOfs      dw      0
  1616. BlankPatLine    db    '║   ║      │     ║║      │     ║║      │     ║║      │     ║',0
  1617. PatternLine    db    '║   ║      │     ║║      │     ║║      │     ║║      │     ║',0
  1618. CurBlock        db      0
  1619. TempPos         dw      0
  1620. CurCount        dw      0
  1621. OldPos          dw      0FFFFh
  1622.  
  1623. Ed_DashStr              db      "---",0
  1624. Ed_SpeedStr             db      "000/000",0
  1625. Ed_PatternStr           db      "000/000",0
  1626. Ed_Zeroes               db      "000",0
  1627. Ed_DontDoPattern        db      0
  1628. Ed_4Hex         db    "0000",0
  1629. Ed_IRQ            db    "00",0
  1630.  
  1631. NewDTA        DTA    <>
  1632.  
  1633. MaxFiles        dw      500
  1634. NumFiles        dw      0
  1635. FileSeg         dd      0
  1636.  
  1637. WildDir         db      "*.*",0
  1638. WildMod         db      "*.MOD",0
  1639. DriveLetter     db      "-:\"
  1640. CurPath         db      65 dup (0)
  1641.  
  1642. DriveStr        db      "-:",0
  1643. DriveList       db      26 dup (0)
  1644.  
  1645. MKLine          db      9 dup (0)
  1646. Ext             db      4 dup (0)
  1647. ExtBlank        db      "~ ",0
  1648. DesBlank        db      "~ ",0
  1649.  
  1650. FileDigits      db      "0000",0
  1651.  
  1652. CurFile         dw      0
  1653. TopFile         dw      0
  1654.  
  1655. ends    MyData
  1656.  
  1657. segment zzzzzseg
  1658.     db    16 dup (?)
  1659. ends    zzzzzseg
  1660.  
  1661.         end     Start
  1662.  
  1663.